package com.atguigu.jxc.service.impl;/*
 *@author 尹凯瑞
 *@date 2020/12/3 14:29
 */

import com.atguigu.jxc.dao.GoodsTypeDao;
import com.atguigu.jxc.domain.ServiceVO;
import com.atguigu.jxc.domain.SuccessCode;
import com.atguigu.jxc.entity.GoodsType;
import com.atguigu.jxc.service.GoodsTypeService;

import org.apache.shiro.util.CollectionUtils;
import org.apache.shiro.util.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;


import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

@Service
public class GoodsTypeServiceImpl implements GoodsTypeService {

    @Autowired
    private GoodsTypeDao goodsTypeDao;

    //查询所有分类
    @Override
    public List<Map> loadGoodsType() {
        //获取所有分类
        List<GoodsType> goodsTypeList = goodsTypeDao.getGoodsType();
        //new一个集合保存一级分类
        List<Map> oneList = new ArrayList<>();
        //创建一个集合
        Map<String, Object> map = new HashMap<>();
        for (GoodsType goodsType : goodsTypeList) {//遍历全部节点
            if (goodsType.getPId().equals(-1)) {//代表是父节点
                //变为树形
                map = this.treeMap(goodsType, goodsTypeList);
                oneList.add(map);
            }
        }

        return oneList;
    }
    //添加分类
    @Override
    public ServiceVO saveType(String goodsTypeName, Integer pId) {
        goodsTypeDao.saveType(goodsTypeName,pId);//先添加
        goodsTypeDao.updateState(goodsTypeName,pId);//再修改状态
        return new ServiceVO(SuccessCode.SUCCESS_CODE,SuccessCode.SUCCESS_MESS);
    }
    //删除分类
    @Override
    public ServiceVO deleteType(Integer goodsTypeId) {

        //1 查出这个要删除的分类信息
        GoodsType goodsType = goodsTypeDao.selectGoodsTypeId(goodsTypeId);
        //删除节点
        goodsTypeDao.deleteType(goodsTypeId);
        //2 根据这个分类信息 获取出它的pid
        Integer pId = goodsType.getPId();

        //3 根据pid 条件 去查询 看库里面有没有数据了
        List<GoodsType> wherePid = goodsTypeDao.selectPId(pId);
        if (CollectionUtils.isEmpty(wherePid) || wherePid.size() == 0) {
            //  4 根据这个pid 去修改 pid对应的分类的getGoodsTypeState = 0
            goodsTypeDao.updateDeletePId(pId);
        }

        return new ServiceVO(SuccessCode.SUCCESS_CODE,SuccessCode.SUCCESS_MESS);
    }

    //封装成树形数据
    private Map treeMap(GoodsType goodsType, List<GoodsType> goodsTypeList) {
        Map map = this.getMap(goodsType);
        Integer goodsTypeId = goodsType.getGoodsTypeId();
        //new一个集合，封装子节点
        List<Map> childrenList = new ArrayList<>();
        for (GoodsType childrenGoodsType : goodsTypeList) {
            if(goodsTypeId.equals(childrenGoodsType.getPId())){
                //判断子节点有没有子节点
                if(childrenGoodsType.getGoodsTypeState() == 1){
                    Map map1 = this.treeMap(childrenGoodsType,goodsTypeList);
                    childrenList.add(map1);
                }else{
                    Map map1 = this.getMap(childrenGoodsType);
                    childrenList.add(map1);
                }
            }
        }
        map.put("children",childrenList);
        return map;
    }

    private Map getMap(GoodsType goodsType) {
        Map map = new HashMap<>();
        map.put("id", goodsType.getGoodsTypeId());
        map.put("text", goodsType.getGoodsTypeName());
        map.put("state", goodsType.getGoodsTypeState() == 1 ? "closed" : "open");
        map.put("iconCls", "goods-type");
        Map<String, Object> hashMap = new HashMap<>();
        hashMap.put("state", goodsType.getGoodsTypeState());
        map.put("attributes", hashMap);
        return map;
    }
}
